package ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.entrega1;

import junit.framework.Assert;

import org.joda.time.DateTime;
import org.junit.Before;
import org.junit.Test;
import org.uqbar.commons.utils.ApplicationContext;
import org.uqbar.commons.utils.MemoryStorage;
import org.uqbar.commons.utils.Storage;

import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.capturas.Captura;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.capturas.Image;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.capturas.TipoInfraccion;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.capturas.Zona;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.categorias.Categoria;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.categorias.Evasor;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.categorias.InfractorFrecuente;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.categorias.Inhabilitado;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.exceptions.EmptyListCapturasException;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.exceptions.PatenteNoReconocidaException;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.externos.VerificadorDePagos;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.homes.AdministradorCapturas;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.homes.AdministradorCategorias;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.mockObjects.MailSender;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.mockObjects.ReconocedorDePatentesMock;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.mockObjects.VerificadorPagos;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.notificaciones.NotificacionMail;
import ar.edu.utn.frba.tadp.tp.grupo4.fotomultas.vehiculos.Vehiculo;

public class Punto5TestCase {

	public Vehiculo unVehiculo;
	public AdministradorCapturas adminCapturas;
	public AdministradorCategorias adCat;
	public Captura unaCaptura;
	
	NotificacionMail notificacionEvasor;
	NotificacionMail notificacionMailLoca;
	
	public String patente;
	public Categoria evasor;
	public Categoria inhabilitado;
	public Categoria iFrecuente;

	public ReconocedorDePatentesMock reconocedorDePatentesMock;
	@Before
	public void setUp() {

		evasor = new Evasor();
		inhabilitado = new Inhabilitado();
		iFrecuente = new InfractorFrecuente();
	
		//adCat = new AdministradorCategorias();
		//adminCapturas = new AdministradorCapturas();
		//VerificadorDePagos verificadorDePagos = new VerificadorPagos();
		ApplicationContext.getInstance().configureSingleton(Storage.class, new MemoryStorage());
		ApplicationContext.getInstance().configureHome(Captura.class);
		ApplicationContext.getInstance().configureSingleton(VerificadorDePagos.class, new VerificadorPagos());		
		ApplicationContext.getInstance().configureSingleton(AdministradorCategorias.class, new AdministradorCategorias());
		adCat = ApplicationContext.getInstance().getSingleton(AdministradorCategorias.class);
		ApplicationContext.getInstance().configureSingleton(AdministradorCapturas.class, new AdministradorCapturas());
		adminCapturas = ApplicationContext.getInstance().getSingleton(AdministradorCapturas.class);

		//unVehiculo = new Vehiculo("ABC 123", adCat, verificadorDePagos);
		unVehiculo = new Vehiculo("ABC 123");
		
		Zona zona = new Zona("Zona Roja", "1552478536");
		TipoInfraccion unaInfraccion = new TipoInfraccion("Cruzar en Rojo", 50,	2000);
		Image foto = new Image();
		
		unaCaptura = new Captura(zona, unaInfraccion, foto, new DateTime());

		MailSender unMailSender = new MailSender();

		notificacionMailLoca = new NotificacionMail(unMailSender);
		notificacionMailLoca.setFrom("sistema-fotomultas@tadp.com.ar");
		notificacionMailLoca.setDireccion("teponeslagorra@policiafederal.gob.ar");

		notificacionEvasor = new NotificacionMail(unMailSender);
		notificacionEvasor.setFrom("sistema-fotomultas@tadp.com.ar");
		notificacionEvasor.setDireccion("capturanus@afip.gob.ar"); 
		
		adCat.addCategoria(evasor);
		adCat.addCategoria(inhabilitado);
		adCat.addCategoria(iFrecuente);

		evasor.setNotificacion(notificacionEvasor);
		
		reconocedorDePatentesMock = new ReconocedorDePatentesMock();
	}

	@Test
	public void verificarListaDePendientes()throws PatenteNoReconocidaException, EmptyListCapturasException {

		//Aca reconoce la patente
		try {
			patente = adminCapturas.reconocerPatente(unaCaptura, reconocedorDePatentesMock);
			System.out.println("La patente reconocida es: " + patente);
		} catch (PatenteNoReconocidaException ex) {
			System.out.println(ex.getMessage());
		}
		
		Assert.assertEquals("ABC 123", patente);
		
		
		//Cuando entra por segunda vez, tira la PatenteNoReconocidaException
		try {
			patente = adminCapturas.reconocerPatente(unaCaptura, reconocedorDePatentesMock);
			System.out.println("La patente reconocida es: " + patente);
		} catch (PatenteNoReconocidaException ex) {
			System.out.println(ex.getMessage());
		}

		//unVehiculo.addCaptura(adminCapturas.obtenerCapturaPendiente());
		unVehiculo.addCaptura(adminCapturas.removerPendiente(unaCaptura));

		Assert.assertEquals(50, unVehiculo.getPuntosRegistro());
		Assert.assertEquals(2000.00, unVehiculo.getMontoMultas());
	}
}
